package com.example.clientmiviamoviego4;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Fragment che gestisce la schermata di ricerca dell'applicazione.
 * 
 * @author Gang of Four
 * */
public class SearchFragment extends Fragment {

	/**
	 * Oggetto che mantiene il riferimento alla View associata a questo
	 * fragment.
	 * */
	private View rootView;
	/**
	 * EditText relative ai campi titolo, regista e attore.
	 * */
	private EditText titleET, directorET, actorET;
	/**
	 * TextView relative al range di date entro cui effettuare la ricerca.
	 * */
	private TextView startDataTW, endDataTW;
	/**
	 * Button di richiesta al server di una ricerca.
	 * */
	private int startDay, startMonth, startYear;
	private int endDay, endMonth, endYear;
	private int currentDay, currentMonth, currentYear;
	/**
	 * Stringa indicante l'URL relativo all'indirizzo IP del server.
	 * */
	private String basePath;
	/**
	 * Booleani indicanti se i campi relativi alle date sono gi� stati
	 * selezionati o meno.
	 * */
	private boolean isFirstStartDateInit, isFirstEndDateInit;
	/**
	 * ArrayList dei generi di film disponibili sul server.
	 * */
	private ArrayList<ParcelableMovieType> prefList;
	/**
	 * ArrayList di generi di film selezionati dall'utente.
	 * */
	private ArrayList<ParcelableMovieType> selectedPrefs = new ArrayList<ParcelableMovieType>();
	/**
	 * Array di booleani relativi ai generi di film selezionati dall'utente.
	 * */
	private boolean checkedPref[];

	/**
	 * Metodo richiamato all'atto dell'istanziamento del fragment.
	 * */
	public static Fragment newInstance(String name) {
		SearchFragment fragment = new SearchFragment();
		Bundle args = new Bundle();
		args.putString("search", name);
		fragment.setArguments(args);
		return fragment;
	}

	/**
	 * Costruttore della classe SearchFragment.
	 * */
	public SearchFragment() {
	}

	/**
	 * Metodo richiamato quando la gerarchia di view viene associata al
	 * fragment. Gestisce il reperimento delle informazioni utili passate dalla
	 * MainActitity, insieme alla creazione della UI.
	 * */
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		basePath = getArguments().getString("basePath");
		prefList = getArguments().getParcelableArrayList("prefList");

		rootView = inflater.inflate(R.layout.fragment_search, container, false);

		isFirstStartDateInit = true;
		isFirstEndDateInit = true;
		initDate();

		titleET = (EditText) rootView.findViewById(R.id.titleEditText);
		directorET = (EditText) rootView.findViewById(R.id.directorEditText);
		actorET = (EditText) rootView.findViewById(R.id.actorEditText);

		titleET.setText("");
		directorET.setText("");
		actorET.setText("");

		if (prefList != null) {
			checkedPref = new boolean[prefList.size()];

			LinearLayout view = (LinearLayout) rootView
					.findViewById(R.id.CheckListLayout);

			for (int i = 0; i < prefList.size(); i++) {
				CheckBox tb = new CheckBox(getActivity());
				tb.setChecked(false);
				tb.setText(prefList.get(i).getKey());
				tb.setId(i);
				tb.setOnClickListener(new CheckBox.OnClickListener() {

					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						CheckBox check = (CheckBox) v;
						try {
							if (!check.isChecked()) {
								checkedPref[v.getId()] = false;
								for (ParcelableMovieType singleMovieType : selectedPrefs) {
									if (singleMovieType.getKey().equals(
											prefList.get(v.getId()).getKey())) {
										selectedPrefs.remove(singleMovieType);
									}
								}

							} else {
								checkedPref[v.getId()] = true;
								selectedPrefs.add(prefList.get(v.getId()));
							}
						} catch (Exception e) {
						}

					}
				});
				view.addView(tb);
			}

			ArrayList<String> movieType = new ArrayList<String>();
			for (ParcelableMovieType m : prefList) {
				movieType.add(m.getKey());
			}

		}

		Button searchButton = (Button) rootView.findViewById(R.id.searchButton);
		searchButton.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				onClickSearch(v);
			}
		});

		return rootView;
	}

	/**
	 * Metodo chiamato nel momento in cui il fragment viene associato
	 * all'activity.
	 * */
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		((MainActivity) activity).onSectionAttached(getArguments().getString(
				"search"));
	}

	/**
	 * Metodo che inizializza le TextView relative alle date di inizio e fine
	 * del range di ricerca.
	 * */
	private void initDate() {
		startDataTW = (TextView) rootView.findViewById(R.id.startDate);
		endDataTW = (TextView) rootView.findViewById(R.id.endDate);

		// Il Calendar prende il mese precedente, probabilmente inizia a contare
		// da 0, quindi sommo 1.
		Calendar calendar = Calendar.getInstance();
		currentDay = calendar.get(Calendar.DAY_OF_MONTH);
		currentMonth = calendar.get(Calendar.MONTH) + 1;
		currentYear = calendar.get(Calendar.YEAR);

		startDay = currentDay;
		startMonth = currentMonth;
		startYear = currentYear;

		endDay = currentDay;
		endMonth = currentMonth;
		endYear = currentYear;

		startUpdate();
		endUpdate();
		startDataTW.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				DatePickerDialog dialog = new DatePickerDialog(getActivity(),
						startListener, currentYear, currentMonth - 1,
						currentDay);
				dialog.show();

			}
		});
		endDataTW.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				DatePickerDialog dialog = new DatePickerDialog(getActivity(),
						endListener, currentYear, currentMonth - 1, currentDay);
				dialog.show();
			}
		});
	}

	/**
	 * Metodo che implementa un oggetto DataPicker al fine di permettere la
	 * selezione delle date.
	 * */
	protected Dialog onCreateDialog(int id) {
		if (id == 0) {
			return new DatePickerDialog(getActivity(), startListener,
					startYear, startMonth - 1, startDay);
		} else {
			return new DatePickerDialog(getActivity(), endListener, endYear,
					endMonth - 1, endDay);
		}
	}

	/**
	 * Listener che restituisce la data di inizio selezionata all'interno di un
	 * oggetto DataPicker.
	 * */
	protected DatePickerDialog.OnDateSetListener startListener = new DatePickerDialog.OnDateSetListener() {
		public void onDateSet(DatePicker dataPicker, int year, int month,
				int day) {
			// Il DataPicker prende il mese precedente, probabilmente inizia a
			// contare da 0, quindi sommo 1.
			startDay = day;
			startMonth = month + 1;
			startYear = year;
			startUpdate();
		}
	};

	/**
	 * Metodo di set della TextView relativa alla data di inizio ricerca.
	 * */
	protected void startUpdate() {
		startDataTW = (TextView) rootView.findViewById(R.id.startDate);

		if (!isFirstStartDateInit) {
			startDataTW.setText(new StringBuilder().append(startDay)
					.append("/").append(startMonth).append("/")
					.append(startYear).append(" "));
		} else {
			startDataTW.setText("");
			isFirstStartDateInit = false;
		}
	}

	/**
	 * Listener che restituisce la data di fine selezionata all'interno di un
	 * oggetto DataPicker.
	 * */
	protected DatePickerDialog.OnDateSetListener endListener = new DatePickerDialog.OnDateSetListener() {
		public void onDateSet(DatePicker dataPicker, int year, int month,
				int day) {
			// Il DataPicker prende il mese precedente, probabilmente inizia a
			// contare da 0, quindi sommo 1.
			endDay = day;
			endMonth = month + 1;
			endYear = year;
			endUpdate();
		}
	};

	/**
	 * Metodo di set della TextView relativa alla data di fine ricerca.
	 * */
	protected void endUpdate() {
		endDataTW = (TextView) rootView.findViewById(R.id.endDate);

		if (!isFirstEndDateInit) {
			endDataTW.setText(new StringBuilder().append(endDay).append("/")
					.append(endMonth).append("/").append(endYear).append(" "));
		} else {
			endDataTW.setText("");
			isFirstEndDateInit = false;
		}
	}

	/**
	 * Metodo che fa partire la ricerca a partire dai parametri di ricerca
	 * selezionati. Eventuali situazioni non volute vengono controllate.
	 * */
	public void onClickSearch(View view) {

		Date startDate = new Date(startYear - 1900, startMonth - 1, startDay);
		Date endDate = new Date(endYear - 1900, endMonth - 1, endDay);

		int duration = Toast.LENGTH_LONG;

		if (((startDataTW.getText().toString().length() != 0) & (endDataTW
				.getText().toString().length() == 0))
				|| ((startDataTW.getText().toString().length() == 0) & (endDataTW
						.getText().toString().length() != 0))) {
			Toast toast = Toast.makeText(getActivity(), getResources()
					.getString(R.string.both_data), duration);
			toast.show();
			startDataTW.requestFocus();

		} else if (endDate.compareTo(startDate) < 0) {
			Toast toast = Toast.makeText(getActivity(), getResources()
					.getString(R.string.end_date_later), duration);
			toast.show();

		} else {

			Intent intent = new Intent(getActivity(),
					ViewListFilmFragmentActivity.class);
			intent.putExtra("isFilmSearch", true);
			intent.putExtra("title", titleET.getText().toString());
			intent.putExtra("director", directorET.getText().toString());
			intent.putExtra("actor", actorET.getText().toString());
			intent.putExtra("startDate", startDataTW.getText().toString());
			intent.putExtra("endDate", endDataTW.getText().toString());
			intent.putExtra("selectedPrefs", selectedPrefs);
			intent.putExtra("basePath", basePath);
			startActivity(intent);

		}
	}
}
